﻿--[[
	Serial accounts - server
	
	Baza danych: MySQL
	Wszystko opiera się na relacjach bazy danych (głównie jeden-do-wielu, ale również jeden-do-jednego. Relacje wiele-do-wielu raczej nie są stosowane).
	Przykładowo: tabela MySQL "accounts"  oraz tabela "serials" użyte do autoryzacji gracza
	 |------------------------------/                    \------------------|
	\/							         							    	\/
	|ID|nazwa-konta|													|ID(serialu)|ID(gracza)|serial|
	|0 |dzakub	   |													|	54223	|	0	   |0ff...|
	 |	  																		        |
	 \----------------------------------------------------------------------------------/
	 
	pole ID w relacji z IDgracza w tabeli serials może być użyte do pobrania seriali, które są dopuszczone przez użytkownika do autoryzacji (wiele seriali pod jedno konto).
	
	Proponuję następujący schemat budowy oraz działania bazy użytkowników:
	
	Tabele:
			- accounts
				W niej zawarte są wszystkie konta użytkowników. Pól: 2
				1. ID gracza - INT
				2. nazwa (pierwszy nick) - STRING
			- serials
				W niej zawarte są seriale dla kont. Pól: 3
				1. ID serialu - INT
				2. ID gracza (relacja powyżej) - INT
				3. serial - STRING
			- userdata
				Zawiera wszystkie dane użytkowników. Działa na zasadzie klucz+wartość. Każde pole posiada swój klucz i odnoszącą się do niego wartość. Pól: 4
				1. ID danych - INT
				2. ID gracza - INT
				3. klucz - STRING
				4. wartosc - STRING
				
	Pola ID gracza stosowane są by określić "czyje dane/seriale są".
	
	Przykłady akcji:
		A. Logowanie
			1. Użytkownik requestuje logowanie
			2. Pobierany jest jego serial
					|	|
					|	\---> Serialu nie ma w bazie - akcja do ustalenia
					\---> Serial jest w bazie - użytkownikowi przypisywany jest numer ID, który można użyć do zapisu/odczytu danych użytkownika
		
		B. Odczyt danych
			0. Użytkownik jest zalogowany
			1. Używając numeru ID przypisanego graczowi pobieramy dane określone odpowiednim kluczem
			
]]

mysqlCon = false
mysqlCon = mysql_connect ( "localhost", "root", "", "df")
outputDebugString("-LOADED-")
function createAccount(player)
	local plName = getPlayerName(player)
	local serial = getPlayerSerial(player)
	local lastuid = mysql_query(mysqlCon, "SELECT `uid` FROM accounts ORDER BY uid DESC LIMIT 1")
	local lastUIDT = mysql_fetch_row (lastuid)
	mysql_free_result(lastuid)
	local res = mysql_query(mysqlCon, "INSERT INTO `accounts` (nick) VALUES ('"..plName.."')")
	--local res = mysql_query(mysqlCon, "SELECT uid FROM accounts WHERE nick='"..plName.."'")
	local uidT = mysql_fetch_assoc (res)
	if (lastUIDT == false) or (lastUIDT == nil) then 
		lastUIDT = 0
	else
		lastUIDT = lastUIDT[1]
	end
	local uid = lastUIDT + 1 -- increase the uid for new player
	local res = mysql_query(mysqlCon, "INSERT INTO serials (uid, serial) VALUES ("..uid..", '"..serial.."')")
	outputDebugString(getPlayerName(player).." registred as uid: "..tostring(uid))
end

function logIn(player, uid)
	setElementData(player, "uid", uid)
	outputDebugString(getPlayerName(player).." logged in as uid: "..tostring(uid))
end

function onJoin()
outputDebugString("player connected")
	setElementData(source, "uid", -1) -- set invalid uid
	local serial = getPlayerSerial(source)
	local res = mysql_query(mysqlCon, "SELECT * FROM serials WHERE serial='"..serial.."'")
	if mysql_num_rows ( res ) == 1 then -- if serial exists
		local sres = mysql_fetch_assoc ( res )
		local uid = sres.uid
		logIn(source, uid) -- this could be performed without creating another function :S
		mysql_free_result(res)
	else
		createAccount(source)
		mysql_free_result(res)
	end
end

addEventHandler("onPlayerJoin", root, onJoin)

function getPlayerSerialData(player, key)
	local uid = tonumber(getElementData(player, "uid"))
	if uid then
		local res =	mysql_query(mysqlCon, "SELECT `value` FROM userdata WHERE `uid`="..uid.." AND `key`='"..key.."'")
		if mysql_num_rows(res) == 1 then
			local val = mysql_fetch_row(res)
			local finval = val[1]
			mysql_free_result(res)
			return val[1]
		else
			mysql_free_result(res)
			return false;
		end
	else
		mysql_free_result(res)
		return false;
	end
end

function setPlayerSerialData(player, key, data)
	local uid = tostring(getElementData(player, "uid"))
	outputConsole(tostring(getPlayerSerialData(player, key)))
	if getPlayerSerialData(player, key) == false then
		local res = mysql_query(mysqlCon,"INSERT INTO userdata(`uid`, `key`, `value`) VALUES ("..uid..", '"..key.."', '"..data.."')")
		return true
	else
		local res = mysql_query(mysqlCon,"UPDATE userdata SET `value`='"..data.."' WHERE `uid`="..uid.." AND `key`='"..key.."'")
		return true
	end
end
